03 类型系统和泛型的本质
类型系统
类型系统用于定义如何将编程语言中的数值和表达式归类为许多不同的类型,以及如何操作这些类型,还有这些类型如何互相作用。
- 内建类型:int、float 和 char 等
- 抽象类型:struct、class 和 function 等
程序语言的类型系统主要提供如下功能:
- 程序语言的安全性:让编译器侦测一些代码的错误
- 利于编译器的优化:让编译器明确地知道程序员的意图
- 代码的可读性:让代码更易读和更易维护,代码的语义也更清楚,代码模块的接口(如函数)也更丰富和清楚
- 抽象化:程序设计者可以对程序以较高层次的方式思考
x = 5;
x = "hello";
在动态类型的语言中,会以类型标记维持程序所有数值的标记,并在运算任何数值之前检查标记。一个变量的类型是由运行时的解释器来动态标记的,这样就可以动态地和底层的计算机指令或内存布局对应起来。
每个语言都需要一个类型检查系统:
- 静态类型检查是在编译器进行语义分析时进行的。语言强制实行类型规则(通常只允许以不丢失信息为前提的自动类型转换),称此处理为强类型,否则为弱类型。
- 动态类型检查系统更多的是在运行时期做动态类型标记和相关检查。
泛型的本质
- 类型是对内存的一种抽象。不同的类型,会有不同的内存布局和内存分配的策略。
- 不同的类型,有不同的操作。所以,对于特定的类型,也有特定的一组操作。
泛型:
- 标准化掉类型的内存分配、释放和访问。
- 标准化掉类型的操作。比如:比较操作,I/O 操作,复制操作……
- 标准化掉数据容器的操作。比如:查找算法、过滤算法、聚合算法……
- 标准化掉类型上特有的操作。需要有标准化的接口来回调不同类型的具体操作……
屏蔽掉数据和操作数据的细节,让算法更为通用,让编程者更多地关注算法的结构,而不是在算法中处理不同的数据类型。